﻿using System;
using System.Collections;

namespace Lesson3_Queue
{
    class Test { }
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("队列");
            #region 知识点一 Queue的本质
            //Queue是一个C#为我们封装好的类
            //他的本质也是object[]数组，只是封装了特殊的存储规则

            //Queue是队列存储容器
            //队列是一种先进先出的数据结构
            //先存入的数据先获取，后存入的数据后获取
            //先进先出 类似于管道 从这头进 那头出

            //与栈差不多 区别就是 栈是死胡同 先进后出 队列是两头通的管道 先进先出
            #endregion

            #region 知识点二 申明
            //需要引用命名空间 using System.Collections;
            Queue queue = new Queue();
            #endregion

            #region 知识点三 增取查改

            #region 增
            //把元素一个一个添加进队列  同样是什么都可以添加
            queue.Enqueue(1);
            queue.Enqueue("123");
            queue.Enqueue(1.4f);
            queue.Enqueue(new Test());
            #endregion

            #region 取
            //队列中不存在删除的概念
            //只有取的概念 取出先加入的对象   同样不能通过索引来取出 只能先入先出
            object v = queue.Dequeue();
            Console.WriteLine(v);
            v = queue.Dequeue();
            Console.WriteLine(v);
            #endregion

            #region 查
            //1.查看队列头部元素但不会移除
            v=queue.Peek();
            Console.WriteLine(v);//1.4
            v = queue.Peek();
            Console.WriteLine(v);//1.4

            //2.查看元素是否存在于队列中
            //跟Stack差不多的方法
            if (queue.Contains(1.4f))
            {
                Console.WriteLine("1.4f存在于队列中");
            }

            #endregion

            #region 改
           //队列无法改变其中的元素 只能进出队列
           //实在要改 只有清除所有
           queue.Clear();
            Console.WriteLine(queue.Count);//清除完了

            queue.Enqueue("hhh");//添加元素以便遍历
            queue.Enqueue("你好");
            queue.Enqueue(1);

            #endregion

            #endregion

            #region 知识点四 遍历  
            //1.长度
            Console.WriteLine(queue.Count);

            //2.用foreach遍历  只作用于查看
            Console.WriteLine("********foreach遍历查看************");
            foreach (var item in queue)
            {
                Console.WriteLine(item);
            }

            //3.还有一种遍历方式
            //  将队列转换为object数组
            Console.WriteLine("********Queue转Object数组for循环遍历查看************");
            Object[] array = queue.ToArray();
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array[i]);
            }
            //4.循环出列
            Console.WriteLine("********循环出列************");

            while (queue.Count>0)
            {
                Console.WriteLine(queue.Dequeue());
            }
            
            Console.WriteLine("循环出列过后的队列长度："+queue.Count);
            #endregion

            #region 知识点五 装箱拆箱
            //与栈的装箱拆箱都一样，去看栈Stack的就好了
            #endregion
            #region 练习题
            //使用队列存储信息，一次性存10条消息，每隔一段时间打印一条消息 控制台打印消息时要有明显停顿感
            //TODO:还没做
            //System.Threading.Thread.Sleep(1000); 控制台暂停1000毫秒 即1秒
            #endregion
        }
    }
}
